package main

import (
	"github.com/dlclark/regexp2"
	"golang.org/x/crypto/bcrypt"
	"log"
	"regexp"
)

// ValidateAccount 验证账号
// 4-16位，大小写字母数字下划线减号
func ValidateAccount(account string) bool {
	pattern := `^[a-zA-Z0-9_-]{4,16}$` // 要用反引号
	match, err := regexp.MatchString(pattern, account)
	log.Printf("validateAccount account=%s, match=%v, err=%v", account, match, err)
	return match
}

// ValidatePassword 验证账号
// 最少6位，包括至少1个大写字母，1个小写字母，1个数字，1个特殊字符
func ValidatePassword(password string) bool {
	pattern := `^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?]).*$` // 要用反引号
	reg, err := regexp2.Compile(pattern, regexp2.None)
	if err != nil {
		log.Printf("validateAccount password=%s, err=%v\n", password, err)
		return false
	}
	match, err := reg.MatchString(password)
	if err != nil {
		log.Printf("validateAccount password=%s, err=%v\n", password, err)
		return false
	}
	return match
}

// BcryptHash 使用 bcrypt 对密码进行加密
func BcryptHash(password string) string {
	bytes, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	return string(bytes)
}

// BcryptCheck 对比明文密码和数据库的哈希值
func BcryptCheck(password, hash string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
	return err == nil
}
